package com.lagou.com.lagou.homework.Modules2.item2;

/*
编程实现控制台版并支持两人对战的五子棋游戏。
（1）绘制棋盘 - 写一个成员方法实现
（2）提示黑方和白方分别下棋并重新绘制棋盘 - 写一个成员方法实现。
（3）每当一方下棋后判断是否获胜 - 写一个成员方法实现。
（4）提示： 采用二维数组来模拟并描述棋盘，
* */
import java.util.Scanner;

public class FiveGame {
    //定义棋盘
    char[][] arr2 = new char[16][16];
    //棋盘初始化，都为+
    public void print(){
                for (int i = 0; i < 16; i++) {
            for (int j = 0; j < 16; j++) {
                arr2[i][j] = '+';
            }
        }
    }
    //1.打印棋盘
    public void board() {

        int[] arr = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};//10
        char[] arr1 = {'a', 'b', 'c', 'd', 'e', 'f'};//6
        //char[][] arr2 = new char[16][16];

        System.out.print("  ");
        //外层打印行
        int k = -1;//行开头flag
        for (int i = 0; i < arr.length + arr1.length + 1; i++) {
            if (i < arr.length + 1) {
                //System.out.println(" ");
                //第一行打印的
                if (i == 0) {
                    for (int j = 0; j < arr.length + arr1.length; j++) {
                        //System.out.print(" ");
                        if (j < arr.length) {
                            System.out.print(" " + arr[j] + " ");//第一行的：0-9
                        } else {
                            System.out.print(" " + arr1[j - 10] + " ");//第一行的：a-f
                        }
                    }
                } else {
                    //非第一行打印+
                    for (int j = 0; j < arr.length + arr1.length + 1; j++) {

                        if (j < arr.length + 1) {
                            //如果是第一列，则使用行开头flag打印0-9
                            if (j == 0) {
                                System.out.print(arr[k] + "  ");
                            } else {
                                System.out.print(arr2[i - 1][j - 1] + "  ");
                            }
                        } else {
                            if (j == 0) {
                                System.out.print(" " + arr1[k - 10] + "  ");
                            } else {
                                System.out.print(arr2[i - 1][j - 1] + "  ");
                            }
                        }
                    }
                }
            } else {
                for (int j = 0; j < arr.length + arr1.length + 1; j++) {

                    if (j == 0) {
                        System.out.print(arr1[k - 10] + "  ");
                    } else {
                        System.out.print(arr2[i - 1][j - 1] + "  ");
                    }
                }
            }
            k++;
            System.out.println(" ");
        }
    }
    //3，判断输赢方法
    public int test(int x,int y){
        int i = 0;
        int cnt = 0;
        boolean falg = true;
        while (falg) {
            //上下判断相邻五子？
            if ((((x + i) >= 0) && ((x + i) < 16)) && (arr2[x][y] == arr2[x + i][y])) {
                cnt++;
            } else if ((((x - i) >= 0) && ((x - i) < 16)) && (arr2[x][y] == arr2[x - i][y])) {
                cnt++;
            } else {
                falg = false;
            }
            i++;
            if (cnt == 5) {
                falg = false;
            }
        }
        //上下判断无果，初始化下一个while
        if (cnt != 5){
            falg = true;
            i = 0;
            cnt = 0;
        }
        while (falg) {
            //左右判断相邻五子？
            if ((((y + i) >= 0) && ((y + i) < 16)) && (arr2[x][y] == arr2[x][y + i])){
                cnt++;
            }else if ((((y - i) >= 0) && ((y - i) < 16)) && (arr2[x][y] == arr2[x][y - i])){
                cnt++;
            } else {
                falg = false;
            }
            i++;
            if (cnt == 5) {
                falg = false;
            }
        }
        //上面判断无果，初始化下一个while
        if (cnt != 5){
            falg = true;
            i = 0;
            cnt = 0;
        }
        while (falg) {
            //左上到右下判断相邻五子？
            if (((x + i) >= 0) && ((y + i) >= 0) && ((x + i) < 16) && ((y + i) < 16) && (arr2[x][y] == arr2[x + i][y + i])){
                cnt++;
            }else if (((x - i) >= 0) && ((y - i) >= 0) && ((x - i) < 16) && ((y - i) < 16) && (arr2[x][y] == arr2[x - i][y - i])){
                cnt++;
            } else {
                falg = false;
            }
            i++;
            if (cnt == 5) {
                falg = false;
            }
        }
        //上面判断无果，初始化下一个while
        if (cnt != 5){
            falg = true;
            i = 0;
            cnt = 0;
        }
        while (falg) {
            //左下到右上判断相邻五子？
            if (((x + i) >= 0) && ((y - i) >= 0) && ((x + i) < 16) && ((y - i) < 16) && (arr2[x][y] == arr2[x + i][y - i])){
                cnt++;
            }else if (((x - i) >= 0) && ((y + i) >= 0) && ((x - i) < 16) && ((y + i) < 16) && (arr2[x][y] == arr2[x - i][y + i])){
                cnt++;
            } else {
                falg = false;
            }
            i++;
            if (cnt == 5) {
                falg = false;
            }
        }
        return cnt;
    }

    //2.落子方法
    public void scInput(){
        boolean falg = true;

        while (falg){
            boolean falg1 = true;
            boolean falg2 = true;
            Scanner sc = new Scanner(System.in);
            while (falg2){
                System.out.println("黑方请选择落子坐标(x y)：");
                int x = sc.nextInt();
                int y = sc.nextInt();
                if(!(((x >= 0) && (x < 16)) && ((y >= 0) && (y <16)))){          //判断边界
                    System.out.println("此地方无法落子,请重新下！");
                }else if(arr2[x][y]=='o' || arr2[x][y]=='x') {
                    System.out.println("此地方已落子,请重新下！");
                }else{
                    arr2[x][y] = 'x';
                    falg2 = false;
                    board();                                          //落子后打印棋盘
                    int t = test(x,y);                                //使用test方法判断输赢
                    if (t == 5){
                        System.out.println("黑赢");
                        falg = false;
                        falg1 = false;
                    }
                }
            }

            while (falg1){
                System.out.println("白方请选择落子坐标(x y)：");
                int x1 = sc.nextInt();
                int y1 = sc.nextInt();
                if(!(((x1 >= 0) && (x1 < 16)) && ((y1 >= 0) && (y1 <16)))){
                    System.out.println("此地方无法落子,请重新下！");
                }else if(arr2[x1][y1]=='o' || arr2[x1][y1]=='x'){
                    System.out.println("此地方已落子,请重新下！");
                }else {
                    arr2[x1][y1] = 'o';
                    falg1 = false;
                    board();
                    int t = test(x1,y1);
                    if (t == 5){
                        System.out.println("白赢");
                        falg = false;
                        falg1 = false;
                    }
                }
            }
//            System.out.println("结束输入按q回车即可,继续任意键");
//            //if()
//            String falge = sc.next();
//            if(falge.equals("q")){
//                falg = false;
//            }
        }
    }

    public static void main(String[] args) {
        System.out.println("-------------五子棋------------");
        System.out.println("分为黑白两方，黑(x),白(o);黑方先下");
        FiveGame fg = new FiveGame();
        fg.print();
        fg.board();
        fg.scInput();
    }
}
